package org.liang.common.utils.math;

import java.text.NumberFormat;

import org.apache.commons.lang3.StringUtils;



/**
 * 数字工具类.
 * 
 * <pre>
 * 提供数据格式化、转换等行为
 * </pre>
 * 
 * @author L.Yang
 * @version 2015年11月11日
 */
public class NumberUtil {
    private NumberUtil() {}


    /** 默认保留小数点位数： 2位. */
    private static final int DEF_SCALE = 2;

    /**
     * 将数据转换成 Double.
     * 
     * @param val
     *            数据值
     * @return double 值
     */
    public static final Double convert2Double(Object val) {
        String value = StringUtils.trim(val.toString());
        if (StringUtils.isEmpty(value)) {
            return null;
        } else {
            return Double.parseDouble(value);
        }
    }


    /**
     * 格式化显示小数.
     * 
     * @param val
     *            需要显示的数值
     * @param scale
     *            小数点后保留几位
     * @return 格式化的结果
     */
    public static final String formatNumber(Double val, int scale) {
        String rtnVal = "";
        java.text.NumberFormat format = NumberFormat.getNumberInstance();
        format.setMaximumFractionDigits(scale);
        format.setMinimumFractionDigits(scale);
        format.setGroupingUsed(false);
        if (val != null) {
            rtnVal = format.format(val);
        }
        return rtnVal;

    }

    /**
     * 格式化显示小数（两位有效数字的小数）.
     * 
     * @param val
     *            需要显示的数值
     * @return 格式化的结果
     */
    public static final String formatNumber(Double val) {
        return formatNumber(val, DEF_SCALE);

    }

    /**
     * 格式化显示小数.
     * 
     * @param val
     *            需要显示的数值
     * @return 格式化的结果
     */
    public static final String formatNumber(String val) {
        Double dobject = null;
        if (StringUtils.isEmpty(val)) {
            return "";
        }
        try {
            dobject = convert2Double(val);
        } catch (Exception e) {
            return null;
        }
        return formatNumber(dobject, DEF_SCALE);

    }

    /**
     * 格式化显示小数.
     * 
     * @param val
     *            需要显示的数值
     * @return 格式化的结果
     */
    public static final String formatNumber(String val, int scale) {
        Double dobject = null;
        if (StringUtils.isEmpty(val)) {
            return "";
        }
        try {
            dobject = convert2Double(val);
        } catch (Exception e) {
            return null;
        }
        return formatNumber(dobject, scale);
    }

    /**
     * 根据最大值最小值生成随机数.
     * 
     * @param min
     *            最小值
     * @param max
     *            最大值
     * @return 随机数 in (最小值, 最大值)
     */
    public static final int randomNumber(int min, int max) {
        return (int) Math.round((Math.random() * (max - min) + min));
    }
}
